package 简单.数学;

/**
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * <p>
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
 * <p>
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-integer
 */
public class 整数反转_7 {

    public static void main(String[] args) {

        int num = -2147483412;
        System.out.println(efficientReverse(num));
        System.out.println(Integer.MIN_VALUE);
        System.out.println(-214384741 < -214748360);

    }

    public static int reverse(int x) {
        String s = String.valueOf(x);
        StringBuilder builder = new StringBuilder();
        for (int i = s.length() - 1; i >= 0; i--) {
            if (x < 0) {
                if (i == s.length() - 1) {
                    builder.append("-");
                }
                if (i != 0) {
                    builder.append(s.charAt(i));
                }
            } else {
                builder.append(s.charAt(i));
            }
        }
        long res = Long.valueOf(builder.toString());
        return (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) ? 0 : (int) res;
    }

    /**
     * 1234
     * 先%10，然后/10
     * <p>
     * 4，123
     * 3，12
     * <p>
     * <p>
     *
     * @param x
     * @return
     */
    public static int efficientReverse(int x) {
        int reverse = 0;
        while (x != 0) {
            //判断在reverse*10的前面
            if (reverse > Integer.MAX_VALUE / 10 || reverse < Integer.MIN_VALUE / 10) {
                return 0;
            }
            int lastNum = x % 10;
            x /= 10;
            //将原数字的末尾元素，推入反转数字的末尾
            //1，先将反转数字*10，得出来一个0的位置，然后加上原数字的末尾元素
            reverse = reverse * 10 + lastNum;
        }
        return reverse;
    }
}
